#pragma once
#include<iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <string>
class TcpSocket
{
    static const int default_port = 8080; // 默认端口
    static const int default_back_que = 3; // 默认全连接队列长度a

private:
    int _listen_sock;
    int _port;
    int _back_que;
public:
    TcpSocket(int port = default_port,int back_que=default_back_que)
        : _port(port),_back_que(back_que)
    {}
    
    bool Initialization()
    {
        _listen_sock= socket(AF_INET, SOCK_STREAM, 0); // 创建套接字
        if(_listen_sock==-1) return false;
        struct sockaddr_in Addr;
        // 初始化地址结构
        memset(&Addr, 0, sizeof(Addr));                // 清零
        Addr.sin_family = AF_INET;                     // 地址族为IPv4
        Addr.sin_port = htons(_port);                   // 设置端口号，转换为网络字节序
        Addr.sin_addr.s_addr = inet_addr("0.0.0.0"); // 设置IPv4地址
        int addrlen = sizeof(Addr);

        int ret=bind(_listen_sock, (sockaddr *)&Addr, addrlen); // 绑定
        if(ret==-1) return false;
        int n=listen(_listen_sock, _back_que); // 监听，设置全连接队列长度
        if(n==-1) return false;

        return true;
    }

    int AcceptConnection()
    {
        struct sockaddr_in PeerAddr;//对端信息
        socklen_t PeerAddrLen = sizeof(PeerAddr);
        int new_sock_fd =accept(_listen_sock,(sockaddr*)&PeerAddr,&PeerAddrLen);//主线程阻塞到这里接收连接
        return new_sock_fd;
    }
    int listen_fd()
    {
        return _listen_sock;
    }
    bool Read(int fd,std::string* s)
    {
        char buf[2048]={0};
        int n=read(fd,buf,sizeof(buf)-1);
        if(n>0)
        {
            *s=buf;
            return true;
        }
        else
        return false;
    }
};